﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Windows.Forms;

namespace System.Windows.Forms
{
  public class DataGridViewFolderBrowserColumn : DataGridViewColumn
  {
    public DataGridViewFolderBrowserColumn()
      : base(new FolderBrowserCell())
    {
    }

    public override DataGridViewCell CellTemplate
    {
      get
      {
        return new FolderBrowserCell();
      }
      set
      {
        // Ensure that the cell used for the template is a CalendarCell.
        if( value != null && !value.GetType().IsAssignableFrom(typeof(FolderBrowserCell)) )
        {
          throw new InvalidCastException("Must be a RichTextCell");
        }
        base.CellTemplate = value;
      }
    }
  }

  public class FolderBrowserCell : DataGridViewTextBoxCell
  {
    public FolderBrowserCell()
      : base()
    {
      // Use the short dateStart format.
      this.Style.Format = "";
    }

    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
      // Set the value of the editing control to the current cell value.
      base.InitializeEditingControl(rowIndex, initialFormattedValue,   dataGridViewCellStyle);
      FolderBrowserEditingControl ctl =DataGridView.EditingControl as FolderBrowserEditingControl;

      FolderBrowserDialog fbd = new FolderBrowserDialog();

      if( this.Value.GetType() != typeof(System.DBNull) )
      {
        fbd.SelectedPath = (string) this.Value;
        ctl.Text = (string) this.Value;
      }

      if( fbd.ShowDialog()== DialogResult.OK )
      {
        ctl.Text  = fbd.SelectedPath;
      }
      else
      {
        if( this.Value.GetType() != typeof(System.DBNull) )
        {
          ctl.Text = (string) this.Value;
        }
      }
    }

    public override Type EditType
    {
      get
      {
        // Return the type of the editing contol that CalendarCell uses.
        return typeof(FolderBrowserEditingControl);
      }
    }

    public override Type ValueType
    {
      get
      {
        // Return the type of the value that CalendarCell contains.
        return typeof(string);
      }
    }

    public override object DefaultNewRowValue
    {
      get
      {
        // Use the current dateStart and time as the default value.
        return "";
      }
    }
  }

  class FolderBrowserEditingControl : TextBox, IDataGridViewEditingControl
  {
    DataGridView dataGridView;
    private bool valueChanged = false;
    int rowIndex;

    public FolderBrowserEditingControl()
    {
    }


    // Implements the IDataGridViewEditingControl.EditingControlFormattedValue 
    // property.
    public object EditingControlFormattedValue
    {
      get
      {
         return this.Text;
      }
      set
      {
        String newValue = value as String;
        if( newValue != null )
        {
          this.Text = newValue;
        }
      }
    }

    // Implements the 
    // IDataGridViewEditingControl.GetEditingControlFormattedValue method.
    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
    {
      return EditingControlFormattedValue;
    }

    // Implements the 
    // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
    public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
    {
      this.Font = dataGridViewCellStyle.Font;
      this.ShortcutsEnabled = true;
    }

    // Implements the IDataGridViewEditingControl.EditingControlRowIndex 
    // property.
    public int EditingControlRowIndex
    {
      get
      {
        return rowIndex;
      }
      set
      {
        rowIndex = value;
      }
    }

    // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey 
    // method.
    public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
    {
      // Let the DateTimePicker handle the keys listed.
      switch( key & Keys.KeyCode )
      {
        case Keys.Left:
        case Keys.Up:
        case Keys.Down:
        case Keys.Right:
        case Keys.Home:
        case Keys.End:
        case Keys.PageDown:
        case Keys.PageUp:
        case Keys.Delete:
          return true;
        default:
          return false;
      }
    }

    // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit 
    // method.
    public void PrepareEditingControlForEdit(bool selectAll)
    {
      // No preparation needs to be done.
    }

    // Implements the IDataGridViewEditingControl
    // .RepositionEditingControlOnValueChange property.
    public bool RepositionEditingControlOnValueChange
    {
      get
      {
        return false;
      }
    }

    // Implements the IDataGridViewEditingControl
    // .EditingControlDataGridView property.
    public DataGridView EditingControlDataGridView
    {
      get
      {
        return dataGridView;
      }
      set
      {
        dataGridView = value;
      }
    }

    // Implements the IDataGridViewEditingControl
    // .EditingControlValueChanged property.
    public bool EditingControlValueChanged
    {
      get
      {
        return valueChanged;
      }
      set
      {
        valueChanged = value;
      }
    }

    // Implements the IDataGridViewEditingControl
    // .EditingPanelCursor property.
    public Cursor EditingPanelCursor
    {
      get
      {
        return base.Cursor;
      }
    }

    protected override void OnTextChanged(EventArgs eventargs)
    {
      // Notify the DataGridView that the contents of the cell
      // have changed.
      valueChanged = true;
      this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
      base.OnTextChanged(eventargs);
    }
  }
}
